上一篇介紹了物件導向,還講了「物件中可以有函數」。
來看看怎麼用吧!
人工智能也可以設計物件,還可以要求指定物件名稱。
「請將FlutterWeb錄音功能整合成一個物件,名稱叫WebRecorder。」
class WebRecorder{
  html.MediaRecorder? _mediaRecorder;
  final _audioStreamController = StreamController<List<int>>();
  Stream<List<int>> get audioStream => _audioStreamController.stream;
  Future<void> startRecording() async {
    final mediaStream = await html.window.navigator.mediaDevices?.getUserMedia({'audio': true});
    _mediaRecorder = html.MediaRecorder(mediaStream!);
    _mediaRecorder!.addEventListener('dataavailable', (event) {
      final blobEvent = event as html.BlobEvent;
      final reader = html.FileReader();
      reader.readAsArrayBuffer(blobEvent.data!);
      reader.onLoadEnd.listen((event) {
        if (reader.readyState == html.FileReader.DONE && reader.result != null)
        {
          
          final data = reader.result as Uint8List;
          print('data : ' + data.length.toString());
          _audioStreamController.add(data);
        }
      });
    });
    _mediaRecorder!.start();
  }
  void stopRecording() async {
    await Future.delayed(Duration(seconds: 10));
    _mediaRecorder?.stop();
    _mediaRecorder = null;
  }
}
然後....
發生了一個問題!
我們不知道何時關閉錄音功能!
可以在執行speak前開始錄音,但這系列的語音功能並不支援「如何告訴其他程式它已經執行完畢」的設計。